package com.sybil.ot.dominio;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "SIL_HISTORICO_FLUJO")
@NamedQueries({
   @NamedQuery(
           name = "Solicitud.instanciaActual",
           query = "SELECT instancia FROM Solicitud s WHERE s.llave.claveFlujo = :claveFlujo AND s.llave.numeroSolicitud = :numeroSolicitud"),
   @NamedQuery(
           name = "Solicitud.maxPorFlujo",
           query = "SELECT MAX(s.llave.numeroSolicitud) FROM Solicitud s WHERE s.llave.claveFlujo = :claveFlujo"
   )
})
public class Solicitud implements Serializable {

   private static final long serialVersionUID = 1L;
   protected SolicitudPK llave;
   private Date fecha;
   private double montoFlujo;
   private int instancia;
   private String terminado;
   private String finalCorrecto;
   private String usuarioCreo;
   private String usuarioModif;
   private Paso paso;
   private Flujo flujo;
   private List<DetalleSolicitud> detalles;
   private Pedido pedido;

   private String clavePaso;

   public Solicitud() {
   }

   public Solicitud(SolicitudPK llave) {
      this.llave = llave;
   }

   public Solicitud(String claveFlujo, int numero) {
      this.llave = new SolicitudPK(claveFlujo, numero);
   }

   @EmbeddedId
   public SolicitudPK getLlave() {
      return llave;
   }

   public void setLlave(SolicitudPK llave) {
      this.llave = llave;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "HIFL_FECHA", nullable = false)
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFecha() {
      return fecha;
   }

   public void setFecha(Date fecha) {
      this.fecha = fecha;
   }

   @Column(name = "HIFL_MONTO_FLUJO")
   public double getMontoFlujo() {
      return montoFlujo;
   }

   public void setMontoFlujo(double montoFlujo) {
      this.montoFlujo = montoFlujo;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "HIFL_INSTANCIA")
   public int getInstancia() {
      return instancia;
   }

   public void setInstancia(int instancia) {
      this.instancia = instancia;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "HIFL_TERMINADO")
   public String getTerminado() {
      return terminado;
   }

   public void setTerminado(String terminado) {
      this.terminado = terminado;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "HIFL_FINAL_CORRECTO")
   public String getFinalCorrecto() {
      return finalCorrecto;
   }

   public void setFinalCorrecto(String finalCorrecto) {
      this.finalCorrecto = finalCorrecto;
   }

   @Basic(optional = false)
   @Column(name = "HIFL_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Size(max = 15)
   @Column(name = "HIFL_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @OrderBy("fecha DESC")
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "solicitud")
   public List<DetalleSolicitud> getDetalles() {
      return detalles;
   }

   public void setDetalles(List<DetalleSolicitud> detalles) {
      this.detalles = detalles;
   }

   @JoinColumns({
      @JoinColumn(name = "HIFL_FLUJ_CLAVE", referencedColumnName = "PAFL_FLUJ_CLAVE", nullable = false, insertable = false, updatable = false),
      @JoinColumn(name = "HIFL_PAFL_CLAVE", referencedColumnName = "PAFL_CLAVE", nullable = false, insertable = false, updatable = false)})
   @ManyToOne(optional = false)
   public Paso getPaso() {
      return paso;
   }

   public void setPaso(Paso paso) {
      if (paso != null) {
         this.clavePaso = paso.getLlave().getClavePaso();
      }
      this.paso = paso;
   }

   @Column(name = "HIFL_PAFL_CLAVE")
   public String getClavePaso() {
      return clavePaso;
   }

   public void setClavePaso(String clavePaso) {
      this.clavePaso = clavePaso;
   }

   @JoinColumn(name = "HIFL_FLUJ_CLAVE", referencedColumnName = "FLUJ_CLAVE", nullable = false, insertable = false, updatable = false)
   @ManyToOne(optional = false)
   public Flujo getFlujo() {
      return flujo;
   }

   public void setFlujo(Flujo flujo) {
      this.flujo = flujo;
   }

//   @OneToOne
   @OneToOne(mappedBy = "solicitud")
   public Pedido getPedido() {
      return pedido;
   }

   public void setPedido(Pedido pedido) {
      this.pedido = pedido;
   }

   
   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof Solicitud)) {
         return false;
      }
      Solicitud other = (Solicitud) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "Solicitud[ llave=" + llave + " ]";
   }
}
